package com.gzhryc.jdbc;

import com.gzhryc.jdbc.models.Parameters;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 * JDBC访问接口
 * @author 张浩
 * @version 1.0
 */
public interface JdbcHelper {
	
	public String getJdbcKey();

	/**
	 * 根据SQL语句获取一个指定对象
	 * @param sql
	 * @param clazz
	 * @return
	 */
	public <T> T get(String sql,Class<T> clazz) throws SQLException;
	
	public <T> T getJoin(String sql,Class<T> clazz) throws SQLException;
	
	/**
	 * 根据查询对象获取一个指定对象
	 * @param query
	 * @param clazz
	 * @return
	 * @throws SQLException
	 */
	public <T> T get(Query query,Class<T> clazz) throws SQLException; 
	
	public <T> T getJoin(Query query,Class<T> clazz) throws SQLException;
	
	/**
	 * 根据SQL语句获取一个Map对象
	 * @param sql
	 * @return
	 * @throws SQLException
	 */
	public Map<String,Object> get(String sql) throws SQLException;
	
	/**
	 * 根据查询对象获取一个Map对象
	 * @param query
	 * @return
	 * @throws SQLException
	 */
	public Map<String,Object> get(Query query) throws SQLException;
	
	/**
	 * 获取第一个字段值
	 * @param query
	 * @param clazz
	 * @return
	 * @throws SQLException
	 */
	public <T> T getFirstField(Query query,Class<T> clazz) throws SQLException;
	
	/**
	 * 根据SQL获取一个指定对象集合
	 * @param sql
	 * @param clazz
	 * @return
	 * @throws SQLException
	 */
	public <T> List<T> find(String sql,Class<T> clazz) throws SQLException;

	public <T> List<T> find(String sql,Parameters params,Class<T> clazz) throws SQLException;
	
	public <T> List<T> findJoin(String sql,Class<T> clazz) throws SQLException;
	
	/**
	 * 根据SQL获取一个指定对象集合并进行分页
	 * @param sql
	 * @param clazz
	 * @param startNum
	 * @param pageLimit
	 * @return
	 * @throws SQLException
	 */
	public <T> List<T> find(String sql,Class<T> clazz,Integer startNum,Integer pageLimit) throws SQLException;
	
	public <T> List<T> findJoin(String sql,Class<T> clazz,Integer startNum,Integer pageLimit) throws SQLException;
	
	/**
	 * 根据查询对象获取一个指定对象集合
	 * @param query
	 * @param clazz
	 * @return
	 * @throws SQLException
	 */
	public <T> List<T> find(Query query,Class<T> clazz) throws SQLException;
	
	public <T> List<T> findJoin(Query query,Class<T> clazz) throws SQLException;

	public <T> List<T> findFirstField(Query query, Class<T> clazz)throws SQLException;
	
	/**
	 * 根据SQL获取一个Map数据集合
	 * @param sql
	 * @return
	 * @throws SQLException
	 */
	public List<Map<String,Object>> find(String sql) throws SQLException;
	
	/**
	 * 根据SQL获取一个Map数据集合
	 * @param sql
	 * @return
	 * @throws SQLException
	 */
	public List<Map<String,Object>> find(String sql,Integer startNum,Integer pageLimit) throws SQLException;
	
	/**
	 * 根据查询对象获取一个Map数据集合
	 * @param query
	 * @return
	 * @throws SQLException
	 */
	public List<Map<String,Object>> find(Query query) throws SQLException;
	
	/**
	 * 根据SQL修改数据，自动提交事务
	 * @param sql
	 * @return
	 * @throws SQLException
	 */
	public int update(String sql) throws SQLException;
	
	/**
	 * 根据SQL添加数据，自动提交事务
	 * @param sql
	 * @return
	 * @throws SQLException
	 */
	public int update(String sql,Parameters params) throws SQLException;
	
	/**
	 * 根据SQL添加数据，自动提交事务
	 * @param sql
	 * @return
	 * @throws SQLException
	 */
	public int insert(String sql,Parameters params) throws SQLException;
	
	/**
	 * 根据SQL添加数据，自动提交事务
	 * @param sql
	 * @param params
	 * @return
	 * @throws SQLException
	 */
	public Long insertByAutoId(String sql,Parameters params) throws SQLException;
	
	/**
	 * 保存对象，自动提交事务
	 * @param obj
	 * @return
	 * @throws SQLException
	 */
	public <T> int insert(T obj) throws SQLException;
	
	/**
	 * 用于保存动态表名的对象，自动提交事务
	 * @param obj
	 * @return
	 * @throws SQLException
	 */
	public <T> int insert(String tableName,T obj) throws SQLException;
	
	/**
	 * 批量新增对象
	 * @param clazz
	 * @param data
	 * @return
	 * @throws SQLException
	 */
	public <T> int insert(Class<T> clazz,List<T> data) throws SQLException;
	
	/**
	 * 批量新增对象
	 * @param tableName
	 * @param clazz
	 * @param data
	 * @return
	 * @throws SQLException
	 */
	public <T> int insert(String tableName,Class<T> clazz,List<T> data) throws SQLException;

}
